package ksv.cron.bean;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * @创建人 xiaojiancheng
 * @时间 2020/8/15
 * @描述 记录定时任务表
 *
 *  定时任务，我们关心的几个方面
 *  <li>    什么时候执行
 *  <li>    一次性的还是周期性的
 *  <li>    回调地址和回调参数
 *
 *  {@link #forceExecute}       如果是单次任务，通过设置这个值，保证一定可以执行一次  如果是周期性的任务，设置这个值就没有任何意义
 */
@Setter
@Getter
public class SysCron {
    /**
     *  定时任务
     *  {@link #id}
     *  {@link #userId}
     *  {@link #paramMap}           回调的时候，会将这些参数完整的返回 对象 和 json的胡安
     *                              如果是其他的数据 也是可以存储在这里面的
     *  {@link #param}              数据库具体存储的 存储在数据库中的格式 字符串
     *
     *  {@link #callbackUrl}        定义的回调地址
     *  {@link #cronExpression}     cron表达式
     *
     *  {@link #createTime}         创建事件
     *  {@link #status}             状态
     *
     *  {@link #second}             偏移多少s执行，正则表达式只具体到 分钟
     *  {@link #forceExecute}       是否强制执行一次 任务在加载的时候 不管有没有下一次 一定会执行一次 因为有些任务已经过时了，
     *  {@link #hash}               分片hash值 客户端决定hash 如果服务本身不满足 那么会进一步取余
     *
     *  {@link #logList}            链路日志列表
     *
     *  锁
     *  <li>    如果任务处于执行中，此时是否需要继续删除
     */
    @TableId
    private Long id;
    private Long userId;

    @TableField(exist = false)
    private Map<String,Object> paramMap;
    @JSONField(serialize = false,deserialize = false)
    private String param;
    private String callbackUrl;
    private String cronExpression;
    private LocalDateTime createTime;
    private String status;
    private Integer second;
    private String forceExecute;
    private int hash;

    public static final SysCron empty = new SysCron();

    @TableField(exist = false)
    private List<SysCronLog> logList;

    @TableField(exist = false)
    private boolean remove = false;

    public void setParam(String param) {
        this.param = param;
        paramMap = ((JSONObject) JSON.parseObject(param));
    }

    public void setParamMap(Map<String, Object> paramMap) {
        this.paramMap = paramMap;
        this.param = JSON.toJSONString(paramMap);
    }

    @Override
    public int hashCode() {
        return id.intValue();
    }
}
